package org.zjframework.traceframe.common.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.Session;

/**
 *
 * 类描述：DAO层泛型基类接口
 *
 * @author: 赵继
 * @date： 日期：2012-12-8 时间：下午05:37:33
 * @version 1.0
 */
public interface ICommonDao {

    public  List<String> getProperty(Class entityName);
	/**
	 * 获取所有数据库表
	 * @return
	 */
	public Integer getAllDbTableSize();
	public <T> void save(T entity);

	/**
	 * easyui拓展 将新插入的数据在datagrid的第一行显示
	 * @param entity
	 * @return
	 */
	public <T> T saveInsertRow(T entity);

	/**
	 * easyui拓展 结合easyui updateRow方法来实现修改数据
	 * @param entity
	 * @return T
	 */
	public <T> T updateRow(T entity);

    public <T> T updateRow4merge(T entity);

	public <T> void batchSave(List<T> entitys);

	public <T> void saveOrUpdate(T entity);

	/**
	 * 删除实体
	 *
	 * @param <T>
	 *
	 * @param <T>
	 *
	 * @param <T>
	 * @param entitie
	 */
	public <T> void delete(T entitie);

	/**
	 * 根据实体名称和主键获取实体
	 *
	 * @param <T>
	 * @param entityName
	 * @param id
	 * @return
	 */
	public <T> T get(Class<T> entityName, Serializable id);

	/**
	 * 根据实体名字获取唯一记录
	 *
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public <T> T findUniqueByProperty(Class<T> entityClass, String propertyName, Object value);

	/**
	 * 按属性查找对象列表.
	 */
	public <T> List<T> findByProperty(Class<T> entityClass, String propertyName, Object value);
	/**
	 * 加载全部实体
	 * @param <T>
	 * @param entityClass
	 * @return
	 */
	public <T> List<T> loadAll(final Class<T> entityClass);

	/**
	 * 根据实体名称和主键获取实体
	 *
	 * @param <T>
	 *
	 * @param <T>
	 * @param entityName
	 * @param id
	 * @return
	 */
	public <T> T getEntity(Class entityName, Serializable id);

	public <T> void deleteEntityById(Class entityName, Serializable id);

	/**
	 * 删除实体集合
	 *
	 * @param <T>
	 * @param entities
	 */
	public <T> void deleteAllEntitie(Collection<T> entities);

	/**
	 * 更新指定的实体
	 *
	 * @param <T>
	 * @param pojo
	 */
	public <T> void updateEntitie(T pojo);

	public <T> void updateEntityById(Class entityName, Serializable id);

	/**
	 * 通过hql 查询语句查找对象
	 *
	 * @param <T>
	 * @param query
	 * @return
	 */
	public <T> List<T> findByQueryString(String hql);

	/**
	 * 通过hql查询唯一对象
	 *
	 * @param <T>
	 * @param query
	 * @return
	 */
	public <T> T singleResult(String hql);

	/**
	 * 根据sql更新
	 *
	 * @param query
	 * @return
	 */
	public int updateBySqlString(String sql);

	/**
	 * 根据sql查找List
	 *
	 * @param <T>
	 * @param query
	 * @return
	 */
	/*public <T> List<T> findListbySql(String query);*/

	/**
	 * 通过属性称获取实体带排序
	 *
	 * @param <T>
	 * @param clas
	 * @return
	 */
	public <T> List<T> findByPropertyisOrder(Class<T> entityClass, String propertyName, Object value, boolean isAsc);

	public Session getSession();
	public List findByExample(final String entityName, final Object exampleEntity);
	/**
	 * 通过hql 查询语句查找HashMap对象
	 *
	 * @param <T>
	 * @param query
	 * @return
	 */
	public Map<Object,Object> getHashMapbyQuery(String query);

	/**
	 * 执行SQL
	 */
	public Integer executeSql(String sql, Object... param);


	/**
	 * 通过JDBC查找对象集合
	 * 使用指定的检索标准检索数据返回数据
	 */
	public List<Map<String, Object>> findForJdbc(String sql, Object... objs);


	/**
	 * 通过JDBC查找对象集合
	 * 使用指定的检索标准检索数据返回数据
	 */
	public Map<String, Object> findOneForJdbc(String sql, Object... objs);

	/**
	 * 通过JDBC查找对象集合,带分页
	 * 使用指定的检索标准检索数据并分页返回数据
	 */
	public List<Map<String, Object>> findForJdbc(String sql, int page, int rows);


	/**
	 * 通过JDBC查找对象集合,带分页
	 * 使用指定的检索标准检索数据并分页返回数据
	 */
	public <T> List<T> findObjForJdbc(String sql, int page, int rows, Class<T> clazz) ;


	/**
	 * 使用指定的检索标准检索数据并分页返回数据-采用预处理方式
	 *
	 * @param criteria
	 * @param firstResult
	 * @param maxResults
	 * @return
	 * @throws org.springframework.dao.DataAccessException
	 */
	public List<Map<String, Object>> findForJdbcParam(String sql, int page, int rows, Object... objs);

	/**
	 * 使用指定的检索标准检索数据并分页返回数据For JDBC
	 */
	public Long getCountForJdbc(String sql) ;
	/**
	 * 使用指定的检索标准检索数据并分页返回数据For JDBC-采用预处理方式
	 *
	 */
	public Long getCountForJdbcParam(String sql, Object[] objs);


	/**
	 * 通过hql 查询语句查找对象
	 *
	 * @param <T>
	 * @param query
	 * @return
	 */
	public <T> List<T> findHql(String hql, Object... param);

	public <T> List<T> findHql4OpenSession(String hql, Object... param);
	/**
	 * 通过hql Map方式查询
	 *
	 * @param <T>
	 * @param query
	 * @return
	 */
	public <T> List<T> findHql(String hql, Map<String, Object> param);


	/**
	 * 执行HQL语句操作更新
	 * @param hql
	 * @return
	 */
	public Integer executeHql(String hql);



	/**
	 * dwz分页操作
	 */
	public <T> List<T> findList(String hql, String keyWord, Integer currentPage, Integer numPerPage, String orderField, String orderDirection)
			throws Exception;
	/**
	 * dwz分页统计条数操作
	 */
	/*public int getAllCount(final String hql) throws Exception;*/

	/*public int getAllRowCount(String hql);*/
	/*
	 * 普通分页操作
	 */
	/*public List queryForPage(final String hql,final int offset,final int length);*/

	/**
	 * easyui分页
	 */
	public <T> List<T> find(String hql, int page, int rows);

	public <T> Set<T> findSet(String hql, int page, int rows);

	/**
	 * easyui带参分页
	 */
	public <T> List<T> find(String hql, int page, int rows, Map<String, Object> param);

	/**
	 * 通过栏目id找到内容,
	 * 按照时间顺序找到前三条数据
	 * @param hql
	 * @param page
	 * @param rows
	 * @param param
	 * @return
	 */
	public <T> List<T> find4channelid(String hql, int page, int rows,
                                      Map<String, Object> param);

	public int countAll1(String hql, Map<String, Object> param);

	public <T> List<T> find4pre(String hql, int page, int rows, Map<String, Object> param);

}
